 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.update.internal.model;
 import java.io.File ;
 import java.io.IOException ;
 import java.net.URL ;
 import java.util.Date ;

 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.update.configurator.IPlatformConfiguration;
 import org.eclipse.update.core.ISite;
 import org.eclipse.update.core.SiteFeatureReference;
 import org.eclipse.update.core.SiteManager;
 import org.eclipse.update.core.model.SiteModel;
 import org.eclipse.update.internal.configurator.FeatureEntry;
 import org.eclipse.update.internal.configurator.PlatformConfiguration;
 import org.eclipse.update.internal.configurator.SiteEntry;
 import org.eclipse.update.internal.core.BaseSiteLocalFactory;
 import org.eclipse.update.internal.core.Messages;
 import org.eclipse.update.internal.core.UpdateCore;
 import org.eclipse.update.internal.core.UpdateManagerUtils;


 /**
  * parse the default site.xml
  */

 public class InstallConfigurationParser {
     private PlatformConfiguration platformConfig;
     private URL siteURL;
     private InstallConfigurationModel config;
     private ConfiguredSiteModel configSite;

     /**
      * Constructor for DefaultSiteParser
      */
     public InstallConfigurationParser(
         IPlatformConfiguration platformConfig,
         InstallConfigurationModel config, boolean light)
         throws IOException , CoreException {

         Assert.isTrue(platformConfig instanceof PlatformConfiguration);
         this.platformConfig = (PlatformConfiguration)platformConfig;
         
         this.config = config;

         // DEBUG:
 if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_PARSING) {
             UpdateCore.debug("Start parsing Configuration:" + (config).getURL().toExternalForm()); //$NON-NLS-1$
 }
         
         if (light) {
             processConfigurationLight(this.platformConfig);
         } else {
             processConfig(this.platformConfig);
         }
     }
     
     



     /**
      * process the Site info
      */
     private void processSite(SiteEntry siteEntry) throws CoreException, IOException {

         //site url
 siteURL = siteEntry.getURL();
         try {
             siteURL = FileLocator.toFileURL(siteURL);
             // TODO workaround bug in platform url resolution
 if (siteURL.getProtocol().equals("file")) //$NON-NLS-1$
 siteURL = new File (siteURL.getFile()).toURL();
         } catch (IOException e) {
             // keep original url
 }

         // policy
 ISite site = SiteManager.getSite(siteURL,null);

         // configuration site
 BaseSiteLocalFactory factory = new BaseSiteLocalFactory();
         configSite = factory.createConfigurationSiteModel((SiteModel) site, siteEntry.getSitePolicy().getType());

         //platform url
 configSite.setPlatformURLString(siteEntry.getURL().toExternalForm());
         
         // configured
 configSite.setEnabled(siteEntry.isEnabled());

         // check if the site exists and is updatable
 configSite.setUpdatable(siteEntry.isUpdateable());
         
         // add to install configuration
 config.addConfigurationSiteModel(configSite);
         configSite.setInstallConfigurationModel(config);
         
         FeatureEntry[] features = siteEntry.getFeatureEntries();
         for (int i=0; i<features.length; i++) {
             processFeature(features[i]);
         }
     }

     /**
      * process the DefaultFeature info
      */
     private void processFeature(FeatureEntry feature) throws CoreException, IOException {

         // url
 String path = feature.getURL();
         URL url = UpdateManagerUtils.getURL(siteURL, path, null);

         if (url != null) {
             SiteFeatureReference ref = new SiteFeatureReference();
             ref.setSite((ISite) configSite.getSiteModel());
             ref.setURL(url);
             (configSite.getConfigurationPolicyModel()).addConfiguredFeatureReference(ref);

             //updateURL
 //TODO do we need the update url and to resolve it?
 // String updateURLString = attributes.getValue("updateURL"); //$NON-NLS-1$
 // URLEntry entry = new URLEntry();
 // entry.setURLString(updateURLString);
 // entry.resolve(siteURL,null);

             // DEBUG:
 if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_PARSING) {
                 UpdateCore.debug("End Processing DefaultFeature Tag: url:" + url.toExternalForm()); //$NON-NLS-1$
 }

         } else {
             UpdateCore.log( Messages.InstallConfigurationParser_FeatureReferenceNoURL, new Exception ());
         }

     }

     /**
      * process the Activity info
      */
 // private void processActivity(Attributes attributes) {
 //
 // // action
 // String actionString = attributes.getValue("action"); //$NON-NLS-1$
 // int action = Integer.parseInt(actionString);
 //
 // // create
 // ConfigurationActivityModel activity =
 // new BaseSiteLocalFactory().createConfigurationActivityModel();
 // activity.setAction(action);
 //
 // // label
 // String label = attributes.getValue("label"); //$NON-NLS-1$
 // if (label != null)
 // activity.setLabel(label);
 //
 // // date
 // String dateString = attributes.getValue("date"); //$NON-NLS-1$
 // Date date = new Date(Long.parseLong(dateString));
 // activity.setDate(date);
 //
 // // status
 // String statusString = attributes.getValue("status"); //$NON-NLS-1$
 // int status = Integer.parseInt(statusString);
 // activity.setStatus(status);
 //
 // config.addActivityModel(activity);
 //
 // // DEBUG:
 // if (UpdateCore.DEBUG && UpdateCore.DEBUG_SHOW_PARSING) {
 // UpdateCore.debug("End Processing Activity: action:" + actionString + " label: " + label + " date:" + dateString + " status" + statusString); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 // }
 //
 // }

     /**
      * process the Config info
      */
     private void processConfig(PlatformConfiguration platformConfig) throws IOException , CoreException {

         // date
 processConfigurationLight(platformConfig);
         
         //timeline
 // String timelineString = attributes.getValue("timeline"); //$NON-NLS-1$
 // long timeline = config.getCreationDate().getTime();
 // if (timelineString!=null) {
 // timeline = Long.parseLong(timelineString);
 // }
 // config.setTimeline(timeline);

         SiteEntry[] sites = platformConfig.getConfiguration().getSites();
         for (int i=0; i<sites.length; i++)
             processSite(sites[i]);

     }



     private void processConfigurationLight(PlatformConfiguration platformConfig) {
         Date date = new Date (platformConfig.getChangeStamp());
         config.setCreationDate(date);
         config.setLabel(date.toString());
         
         config.setCurrent( date.equals(org.eclipse.update.internal.configurator.PlatformConfiguration.getCurrent().getConfiguration().getDate()));
     }
     
 }

